<!DOCTYPE html>
<html>
<head>
    <title>函数声明 & 函数表达式</title>
</head>
<body>
<script>
/*

函数声明：
function functionName(arg0,arg1,arg2){
     //函数体
}




函数表达式有3种：

命名函数表达式：
var functionName = function aFunctionName(arg0,arg1,arg2){}

匿名函数表达式：
var functionName = function(arg0,arg1,arg2){}

其他：
(function aaa(){}) : 函数表达式
~function aaa(){} : 函数表达式
-function aaa(){} : 函数表达式
+function aaa(){} : 函数表达式
!function aaa(){} : 函数表达式


两者区别：

函数表达式可以直接加括号执行，函数声明不可以


1、函数声明在代码执行以前被加载到作用域中，后者在代码执行到那一行时才有定义
2、前者给函数指定一个名字，后者创建一个匿名函数，然后赋给一个变量


变量声明提升，赋值不提升，赋值在执行到时才发生。

函数式声明：声明+函数体一起被提升。
函数表达式：声明会被提升，但是它指向的函数体只会在执行的时候才被赋值。






*/




/*~function aaa(){
    alert("aaa");
}()*/



/*var a = function aaa(){
    alert(1);
    alert(typeof aaa);  //内部是可以找到aaa的
}

a();     //正常调用
aaa();   //报错：Uncaught ReferenceError: aaa is not defined   
// 外部找不到aaa ; 但是IE6，7，8还是会把aaa解析成a，在外部能访问；一般不推荐写命名函数表达式*/



/*(function aaa(){alert(1);})   //函数表达式
aaa();    //报错：Uncaught ReferenceError: aaa is not defined;   但是IE6，7，8 正常
*/


function aaa(){
    return bbb();
}

/*function bbb(){
    debugger;
}*/

var bbb = (function xxx(){
    return function(){
        debugger;
    }
})();

aaa();


</script>
</body>
</html>